/*
  请求
*/
import axios from 'axios'
//在非组件中获取store必须使用这种方式
//这里单独加载store和组件中this.$store是一样的
import store from '@/store/index.js'
import JSONbig from 'json-bigint'
import router from '@/router/index.js'
const refreshTokenReq=axios.create(
  {
    baseURL:'http://toutiao-app.itheima.net'
  }
)
const request=axios.create({
  // http://toutiao-app.itheima.net http://ttapi.research.itcast.cn/
  baseURL:'http://toutiao-app.itheima.net',
  transformResponse:[function(data){
    //后端返回的数据可能不是JSON格式字符串
    //如果不是的话，那么JSONbig.parse调用就会报错
    //所以我们使用try-catch来捕获异常，处理异常的发生
     try{
       //如果转换成功，则直接把结果返回
       return JSONbig.parse(data)
     }catch(err){
        console.log('转换失败',err)
        //如果转换失败了，则进入这里
        //我们在这里把数据原封返回给网络请求使用
        return data
     }
     //axios默认在内部使用JSON.parse 来转换处理原始数据
     //return JSON.parse(data)
  }]
})

//请求拦截器

request.interceptors.request.use(function (config) {
   const { user }=store.state
   //如果用户已登录
   if(user){
         config.headers.Authorization=`Bearer ${user.token}`
   }
   //处理完之后返回config
   return config;
  }, function (error) {
    return Promise.reject(error);
});
//响应拦截器
//统一处理401
request.interceptors.response.use(function (response) {
   //响应成功
   return response
},async function(error){
   //响应失败
   const {status}=error.response
   if(status===400){
     console.log('请求参数错误')
   }else if(status===401){
    console.log('token无效')
    //如果没有user或者user.token 重新登录
    const {user}=store.state
    if(!user || !user.token){
      return redirectLogin()
    }
    //使用refresh_token请求获取新的token
     try {
      const {data} = await refreshTokenReq({
         method:'PUT',
         url:'/v1_0/authorizations',
         headers:{
          Authorization:`Bearer ${user.refresh_token}`
         }
      })
      //拿到新的token之后把它更新到容器中
       user.token=data.data.token
       store.commit('setUser',user)
       console.log(data)
       //把失败的请求重新发出去
      //error.config 本次请求的相关的配置对象
       return request(error.config)
     } catch (error) {
       //重新登录
        redirectLogin()
     }

   }
   else if(status===403){
    console.log('没有权限')
   }else if(status>=500){
     console.log('服务端异常')
   }
   //抛出异常
   return Promise.reject(error)
});
function redirectLogin(){
  router.replace({
    name:'login',
    //传递查询参数，查询参数会以?作为分隔符放到url后面
    query:{
      redirect:router.currentRoute.fullPath
    }
  })
}
export default request


